package com.yanwq.sayhi.common;

import android.content.Context;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.yanwq.sayhi.widget.MToast;

/**
 * 作者：yanwq。
 * 日期：2016/1/31。
 */
public class LocMgr {

    private Context mContext;
    private LocationClient mLocationClient;

    private static LocMgr instance;

    public static LocMgr getInstance(Context context) {
        syncInit(context);
        return instance;
    }

    private synchronized static void syncInit(Context context) {
        if (instance == null) {
            instance = new LocMgr(context.getApplicationContext());
        }
    }

    private LocMgr(Context context) {
        mContext = context;
        initLocation();
    }

    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
        int span = 0;
        option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps
        option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.SetIgnoreCacheException(false);//可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        mLocationClient = new LocationClient(mContext);
        mLocationClient.setLocOption(option);
    }

    public void locOne(final MLocationListener listener) {
        mLocationClient.registerLocationListener(new BDLocationListener() {
                                                     @Override
                                                     public void onReceiveLocation(BDLocation location) {

                                                         if (location.getLocType() == BDLocation.TypeServerError) {
                                                             listener.onFail();
                                                             MToast.showShort(mContext, "服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
                                                         } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                                                             listener.onFail();
                                                             MToast.showShort(mContext, "网络不同导致定位失败，请检查网络是否通畅");
                                                         } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                                                             listener.onFail();
                                                             MToast.showShort(mContext, "无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");
                                                         }

                                                         if (location.getLocType() == BDLocation.TypeGpsLocation
                                                                 || location.getLocType() == BDLocation.TypeNetWorkLocation
                                                                 || location.getLocType() == BDLocation.TypeOffLineLocation) {// GPS定位结果
                                                             listener.onReceiveLocation(location);
                                                         } else {
                                                             listener.onFail();
                                                         }

                                                         mLocationClient.unRegisterLocationListener(this);
                                                         mLocationClient.stop();
                                                     }
                                                 }

        );
        mLocationClient.start();
    }

    public interface MLocationListener {
        void onReceiveLocation(BDLocation location);

        void onFail();
    }
}

